
#ifndef AUTOMATE_H_
#define AUTOMATE_H_

#include "liste.h"

typedef struct s_automate{
         int size;
         int sizealpha;
         int* initial;
         int* final;
         liste_s*** trans;
} automate_s;

void ajouteTransition( const int depart, const int arrivee, const char lettre, automate_s *graphe );
automate_s* creer_automate_taille( const int nbreEtat, const int nbrEtiquette );
void afficheAutomate( const automate_s const *graphe);
automate_s* creer_contraire( const automate_s const *base );
int supprimeTransition( const int depart, const int arrivee, const char lettre, automate_s *graphe);
int complet( const automate_s const *graphe);
int deterministe( const automate_s const *graphe );
int compte_transition( const automate_s const *graphe);
void supprimeEtat( const int etat, automate_s *graphe);
void remplace_transition( automate_s *graphe, const int search, const int replace );
void fusion_etat( automate_s* automate, const int etat_1, const int etat_2);
automate_s* produit( const automate_s const *a1, const automate_s const *a2 );
void libere_automate( automate_s **a );
int intersectionVide( const automate_s const *a1, const automate_s const *a2);
automate_s* determinise( automate_s* a);
int isInclu( const automate_s const *big, const automate_s const *little );
void complete_automate( automate_s *automate );
automate_s* dupliqueAutomate( const automate_s const *automate );
automate_s* determinise(automate_s* automaton);
int rechercheEtatInitial(automate_s* automaton);

automate_s* minimise_hopcroft( automate_s* automate );
void print_tableau_int( const int * tab, const int taille );
int tableau_equiv( const int* tab1, const int* tab2, const int taille );
int* congruenceSuiv( automate_s* automate, const int *prec );
void congruence1( automate_s* automate, int *tab );
void creer_transition_minimal( automate_s *nouveau, automate_s *precedent, const int *etats );
automate_s* minimiseNerode( const automate_s const * base );
void reduit_transition( automate_s *automate, const int etat_min );

#endif
